package com.basic.contraller;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;

public class Lucene {
    @Test
//    创建索引
    public void testIndex() throws  Exception{
//        1.创建一个indexWrite对象
//        1）指定索引库的存放位置Directory对象
//        2）指定一个分析器，对文档内容进行分析
        Directory directory = FSDirectory.open(new File("D:\\temp\\index"));
//       官方推荐
        Analyzer analyzer = new IKAnalyzer();
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST,analyzer);
        IndexWriter indexWriter =new IndexWriter(directory,indexWriterConfig);


//        3.创建field对象将filed添加到document对象中
        File f = new File("D:\\Lucene\\searchsource");
        File[] listFiles = f.listFiles();
        for (File file:listFiles) {
            //        2.创建document对象
            Document document = new Document();
//            文件名称
            String file_name = file.getName();
            Field fileNameField = new TextField("fileName",file_name, Field.Store.YES);
//            文件大小
            long file_size = FileUtils.sizeOf(file);
            Field fileSizeField = new LongField("fileSize",file_size, Field.Store.YES);
//            文件路径
            String file_path = file.getPath();
            Field filePathField = new StoredField("filePath",file_path);
//            文件内容
          String file_content=  FileUtils.readFileToString(file);
            Field fileContentField = new TextField("fileContent",file_content, Field.Store.YES);
            document.add(fileNameField);
            document.add(fileSizeField);
            document.add(filePathField);
            document.add(fileContentField);
//        4.使用indexWriter对象将document对象写入索引库，此过程进行索引创建，并将索引和document对象写入索引库
            indexWriter.addDocument(document);
        }
//        5.关闭indexWriter对象
        indexWriter.close();
    }
//    查找
    @Test
    public  void testSearch()throws Exception{

//1.创建directory对象 也就是索引库存放的位置 硬盘上的库
        Directory directory = FSDirectory.open(new File("D:\\temp\\index"));
//        Directory directory1 =new RAMDirectory();内存索引库
//2.创建一个indexReader对象 需要指定indexReader对象
        IndexReader indexReader = DirectoryReader.open(directory);
//3.创建一个indexSearch对象需要指定indexReader对象
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4.创建一个TermQuery对象 指定查询的域和查询的关键词
        Query query =new TermQuery(new Term("fileName","tomcat"));
//5.执行查询
      TopDocs topDocs =  indexSearcher.search(query,10);
//6.返回查询结果 遍历查询结果并输出
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc:scoreDocs) {
            int doc =scoreDoc.doc;
            Document document = indexSearcher.doc(doc);
//            文件名称
            String fileName = document.get("fileName");
//            文件内容
            String fileContent = document.get("fileContent");
//            文件路径
            String fileSize = document.get("fileSize");
//            文件大小
            String filePath = document.get("filePath");
            System.out.println("文件名称: "+fileName+"文件路径: "+filePath+"文件大小: "+fileSize);
        }
//7.关闭indexReader对象
    }

    // 查看标准分析器的分词效果
    @Test
    public void testTokenStream() throws Exception {
        // 创建一个标准分析器对象
//		Analyzer analyzer = new StandardAnalyzer();
//		Analyzer analyzer = new CJKAnalyzer();
//		Analyzer analyzer = new SmartChineseAnalyzer();
        Analyzer analyzer = new IKAnalyzer();
        // 获得tokenStream对象
        // 第一个参数：域名，可以随便给一个
        // 第二个参数：要分析的文本内容
//		TokenStream tokenStream = analyzer.tokenStream("test",
//				"The Spring Framework provides a comprehensive programming and configuration model.");
        TokenStream tokenStream = analyzer.tokenStream("test",
                "高富帅可以用二维表结构来逻辑表达实现的数据");
        // 添加一个引用，可以获得每个关键词
        CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
        // 添加一个偏移量的引用，记录了关键词的开始位置以及结束位置
        OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
        // 将指针调整到列表的头部
        tokenStream.reset();
        // 遍历关键词列表，通过incrementToken方法判断列表是否结束
        while (tokenStream.incrementToken()) {
            // 关键词的起始位置
            System.out.println("start->" + offsetAttribute.startOffset());
            // 取关键词
            System.out.println(charTermAttribute);
            // 结束位置
            System.out.println("end->" + offsetAttribute.endOffset());
        }
        tokenStream.close();
    }
}
